home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / misc / gms_dev.lha / GMSDev / Source / C / Blitter / Fireworks.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-09-05  |  4.1 KB  |  150 lines

  1. /* Name:   Fireworks Demo
  2. ** Author: Paul Manias
  3. **
  4. */
  5.  
  6. #include <proto/dpkernel.h>
  7.  
  8. BYTE *ProgName      = "Fireworks Demo";
  9. BYTE *ProgAuthor    = "Paul Manias";
  10. BYTE *ProgDate      = "May 1998";
  11. BYTE *ProgCopyright = "DreamWorld Productions (c) 1998.  Freely distributable.";
  12. BYTE *ProgShort     = "A new fireworks demo for GMS.";
  13.  
  14. #define AMT_FIREWORKS 7   /* Maximum fireworks (7, 15, 31 only) */
  15. #define AMT_PIXELS    60  /* Maximum pixel burst for each firework */
  16. #define GRAVITY       1
  17.  
  18. struct Spark {
  19.   WORD XCoord;
  20.   WORD YCoord;
  21.   LONG Colour;
  22.   WORD XSpeed;
  23.   WORD YSpeed; 
  24. };
  25.  
  26. struct Firework {
  27.   WORD XCoord;
  28.   WORD YCoord;
  29.   WORD XSpeed;
  30.   WORD YSpeed;
  31.   WORD Colour;
  32.   WORD BurstCount;
  33.   struct Spark Pixels[AMT_PIXELS];
  34. };
  35.  
  36. struct Firework Fireworks[AMT_FIREWORKS];
  37.  
  38. struct PixelList PixelList = {
  39.   AMT_PIXELS,
  40.   sizeof(struct Spark),
  41.   NULL
  42. };
  43.  
  44. struct GScreen *Screen;
  45.  
  46. /***************************************************************************/
  47.  
  48. void SetFirework(struct Firework *Firework)
  49. {
  50.    Firework->XCoord = FastRandom(Screen->Width);
  51.    Firework->YCoord = Screen->Height;
  52.    Firework->XSpeed = FastRandom(10)-5;
  53.    Firework->YSpeed = -(FastRandom(10)+10);
  54.    Firework->BurstCount = FastRandom(20)+10;
  55.  
  56.    Screen->Bitmap->Palette[Firework->Colour+3] = ((FastRandom(100)+150)<<16) | ((FastRandom(100)+150)<<8) | (FastRandom(100)+150);
  57. }
  58.  
  59. /***************************************************************************/
  60.  
  61. void main(void)
  62. {
  63.   WORD i, j;
  64.   struct JoyData *joy;
  65.   struct RGB *Pixel;
  66.  
  67.   if (Screen = InitTags(NULL,
  68.        TAGS_SCREEN,    NULL,
  69.        GSA_Attrib,     SCR_DBLBUFFER,
  70.        TAGEND)) {
  71.  
  72.     if (joy = Init(Get(ID_JOYDATA),NULL)) {
  73.        Show(Screen);
  74.  
  75.        /*** Setup the fireworks ***/
  76.  
  77.        for (i=0; i < AMT_FIREWORKS; i++) {
  78.           Fireworks[i].Colour = i;
  79.           SetFirework(&Fireworks[i]);
  80.        }
  81.  
  82.        UpdatePalette(Screen);
  83.  
  84.        /*** Main loop ***/
  85.  
  86.        do {
  87.          Clear(Screen->Bitmap);
  88.          Query(joy);
  89.  
  90.          for (i=0; i < AMT_FIREWORKS; i++) {
  91.             if (Fireworks[i].BurstCount > 0) {
  92.                Fireworks[i].XCoord += Fireworks[i].XSpeed;
  93.                Fireworks[i].YCoord += Fireworks[i].YSpeed;
  94.                Fireworks[i].YSpeed += GRAVITY;
  95.                Fireworks[i].BurstCount--;
  96.                DrawPixel(Screen->Bitmap, Fireworks[i].XCoord, Fireworks[i].YCoord, Fireworks[i].Colour);
  97.  
  98.                if (Fireworks[i].BurstCount IS 0) {
  99.                   /*** Explode the firework by setting up the pixel list ***/
  100.  
  101.                   for (j=0; j < AMT_PIXELS; j++) {
  102.                      Fireworks[i].Pixels[j].XCoord = Fireworks[i].XCoord;
  103.                      Fireworks[i].Pixels[j].YCoord = Fireworks[i].YCoord;
  104.                      Fireworks[i].Pixels[j].Colour = Fireworks[i].Colour;
  105.                      Fireworks[i].Pixels[j].XSpeed = FastRandom(14)-7 ;
  106.                      Fireworks[i].Pixels[j].YSpeed = -(FastRandom(20));
  107.                   }
  108.                }
  109.             }
  110.             else {
  111.                /*** Explosion is active ***/
  112.  
  113.                for (j=0; j < AMT_PIXELS; j++) {
  114.                   Fireworks[i].Pixels[j].XCoord += Fireworks[i].Pixels[j].XSpeed;
  115.                   Fireworks[i].Pixels[j].YCoord += Fireworks[i].Pixels[j].YSpeed;
  116.                   Fireworks[i].Pixels[j].YSpeed += GRAVITY;
  117.                }
  118.                Fireworks[i].BurstCount--;
  119.  
  120.                /*** Lower colour values ***/
  121.  
  122.                Pixel = (struct RGB *)(&Screen->Bitmap->Palette[Fireworks[i].Colour+3]);
  123.                if (Pixel->Red   > 3) Pixel->Red   -= 3;
  124.                if (Pixel->Green > 3) Pixel->Green -= 3;
  125.                if (Pixel->Blue  > 3) Pixel->Blue  -= 3;
  126.  
  127.                /*** Draw the pixels ***/
  128.  
  129.                PixelList.Pixels = (struct PixelEntry *)&Fireworks[i].Pixels;
  130.                DrawPixelList(Screen->Bitmap,&PixelList);
  131.  
  132.                if (Fireworks[i].BurstCount < -50) {
  133.                   SetFirework(&Fireworks[i]);
  134.                }
  135.             }
  136.          }
  137.  
  138.          UpdatePalette(Screen);
  139.  
  140.          WaitAVBL();
  141.          SwapBuffers(Screen);
  142.        } while (!(joy->Buttons & JD_LMB));
  143.  
  144.     Free(joy);
  145.     }
  146.   Free(Screen);
  147.   }
  148. }
  149.  
  150.